package co.edu.usbcali.rebio.modelo.control;

import co.edu.usbcali.rebio.dataaccess.daoFactory.XMLHibernateDaoFactory;
import co.edu.usbcali.rebio.dataaccess.sessionFactory.HibernateSessionFactory;
import co.edu.usbcali.rebio.exceptions.*;
import co.edu.usbcali.rebio.modelo.*;
import co.edu.usbcali.rebio.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.rebio.utilities.Utilities;

import groovyjarjarasm.asm.tree.IntInsnNode;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.faces.model.SelectItem;
import javax.print.attribute.standard.Sides;

import jxl.demo.XML;

/**
 * interface RebSuerteLogic
 * 
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * 
 */
public class RebSuerteLogic implements IRebSuerteLogic {
	public List<RebSuerte> getRebSuerte() throws Exception {
		List<RebSuerte> list = new ArrayList<RebSuerte>();

		try {
			list = XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
			.findAll();
		} catch (Exception e) {
			throw new ZMessManager().new GettingException(ZMessManager.ALL
					+ "RebSuerte");
		} finally {
		}

		return list;
	}

	public void saveRebSuerte(Double surArea, Integer surCodigo,
			String surEstado, Date surFechadecorte, String surNombre,
			Integer surZafra, Integer hadId_RebHacienda,
			Integer vdcCodigo_RebVariedadDeCana, Integer surTratamiento)
	throws Exception {
		RebSuerte entity = null;

		try {
			if (surArea == null) {
				throw new ZMessManager().new EmptyFieldException("surArea");
			}

			/*
			 * if ((surArea != null) &&
			 * (Utilities.checkNumberAndCheckWithPrecisionAndScale("" + surArea,
			 * 10, 2) == false)) { throw new ZMessManager().new
			 * NotValidFormatException("surArea"); }
			 */

			/*
			 * if (surCodigo == null) { throw new ZMessManager().new
			 * EmptyFieldException("surCodigo"); }
			 */

			if (surEstado == null) {
				throw new ZMessManager().new EmptyFieldException("surEstado");
			}

			if ((surEstado != null)
					&& (Utilities.checkWordAndCheckWithlength(surEstado, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException(
				"surEstado");
			}

			if (surNombre == null) {
				throw new ZMessManager().new EmptyFieldException("surNombre");
			}

			if ((surNombre != null)
					&& (Utilities.checkWordAndCheckWithlength(surNombre, 60) == false)) {
				throw new ZMessManager().new NotValidFormatException(
				"surNombre");
			}

			if (hadId_RebHacienda == null) {
				throw new ZMessManager().new EmptyFieldException(
				"hadId_RebHacienda");
			}

			if (vdcCodigo_RebVariedadDeCana == null) {
				throw new ZMessManager().new EmptyFieldException(
				"vdcCodigo_RebVariedadDeCana");
			}
			
			Object variables2[] = {"surNombre",true,surNombre, "="};
			
			Integer nombre;
			
			
            List<RebSuerte> entities = BusinessDelegatorView.findByCriteriaInRebSuerte(variables2, null, null);
            for (RebSuerte suerte : entities) {
            	
				nombre = suerte.getRebHacienda().getHadId();
				
				if (entities.size()!= 0 && hadId_RebHacienda.equals(nombre)) {
	                throw new ZMessManager(ZMessManager.ENTITY_WITHSAMENAME);
	            }
			}

            

			IRebHaciendaLogic logicRebHacienda1 = new RebHaciendaLogic();
			IRebVariedadDeCanaLogic logicRebVariedadDeCana2 = new RebVariedadDeCanaLogic();
			RebHacienda rebHaciendaClass = logicRebHacienda1
			.getRebHacienda(hadId_RebHacienda);
			RebVariedadDeCana rebVariedadDeCanaClass = logicRebVariedadDeCana2
			.getRebVariedadDeCana(vdcCodigo_RebVariedadDeCana);

			if (rebHaciendaClass == null) {
				throw new ZMessManager().new ForeignException("rebHacienda");
			}

			if (rebVariedadDeCanaClass == null) {
				throw new ZMessManager().new ForeignException(
				"rebVariedadDeCana");
			}

			/*
			 * entity = getRebSuerte(surCodigo);
			 * 
			 * if (entity != null) { throw new
			 * ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY); }
			 */


			entity = new RebSuerte();
			entity.setSurArea(surArea);
			entity.setSurCodigo(surCodigo);
			entity.setSurEstado(surEstado);
			entity.setSurFechadecorte(surFechadecorte);
			entity.setSurNombre(surNombre);
			entity.setSurZafra(surZafra);
			entity.setRebHacienda(rebHaciendaClass);
			entity.setRebVariedadDeCana(rebVariedadDeCanaClass);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getRebSuerteDAO().save(entity);
			HibernateSessionFactory.flush();

			// Actualiza hacienda

			logicRebHacienda1.updateRebHacienda(rebHaciendaClass.getHadAdministrador(), 
					rebHaciendaClass.getHadArea()+ surArea, 
					rebHaciendaClass.getHadCodigo(),
					rebHaciendaClass.getHadEmailadmin(), 
					rebHaciendaClass.getHadEstado(), 
					rebHaciendaClass.getHadId(),
					rebHaciendaClass.getHadMayordomo(), 
					rebHaciendaClass.getHadNombre(), 
					rebHaciendaClass.getHadTelefonoadmin(), 
					rebHaciendaClass.getHadTelefonomayo(), 
					rebHaciendaClass.getRebCliente().getCliIdentificacion(),
					rebHaciendaClass.getRebIngenio().getIngCodigo(),
					rebHaciendaClass.getRebVereda().getVedCodigo());

			// Fechas tratamientos
			if (surTratamiento != 0 && surFechadecorte != null) {
				IRebAgentesTratamientoLogic logic = new RebAgentesTratamientoLogic();
				Object variables[] = { "rebTratamineto.traCodigo", true,
						surTratamiento, "=" };
				RebFechasTratamiento entity2 = new RebFechasTratamiento();
				List<RebAgentesTratamiento> agentesTratamiento = logic
				.findByCriteria(variables, null, null);
				Calendar fecha = Calendar.getInstance();
				fecha.setTime(surFechadecorte);
				fecha.add(Calendar.DAY_OF_MONTH, 1);
				System.out.println(fecha.getTime());
				Date fecha2;
				for (RebAgentesTratamiento rebAgentesTratamiento : agentesTratamiento) {

					if (rebAgentesTratamiento.getAgtAplicacion() < 4) {
						fecha.add(Calendar.MONTH, 3);
					} else {
						fecha.add(Calendar.MONTH, 5);
					}

					fecha.add(Calendar.DAY_OF_MONTH, 15);
					fecha2 = fecha.getTime();
					fecha.setTime(surFechadecorte);
					fecha.add(Calendar.DAY_OF_MONTH, 1);
					System.out.println(fecha.getTime());
					entity2.setRebSuerte(entity);
					entity2.setRebAgentesTratamiento(rebAgentesTratamiento);
					entity2.setFetEstado("Activo");
					entity2.setFetCodigo(null);
					entity2.setFetFecha(fecha2);
					IRebFechasTratamientoLogic logic2 = new RebFechasTratamientoLogic();
					logic2.saveRebFechasTratamiento(null, entity2
							.getFetEstado(), entity2.getFetFecha(), entity2
							.getRebAgentesTratamiento().getAgtCodigo(), entity2
							.getRebSuerte().getSurCodigo());
					// XMLHibernateDaoFactory.getInstance()
					// .getRebFechasTratamientoDAO().save(entity2);
				}

			}
			// HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void deleteRebSuerte(Integer surCodigo) throws Exception {
		RebSuerte entity = null;

//		Date date = new Date();

		if (surCodigo == null) {
			throw new ZMessManager().new EmptyFieldException("surCodigo");
		}

		List<RebFechasTratamiento> rebFechasTratamientos = null;
		entity = getRebSuerte(surCodigo);
		
		RebHacienda entityHacienda = XMLHibernateDaoFactory.getInstance().getRebHaciendaDAO().findById(entity.getRebHacienda().getHadId());
		entityHacienda.setHadArea(entityHacienda.getHadArea()- entity.getSurArea());
		XMLHibernateDaoFactory.getInstance().getRebHaciendaDAO().update(entityHacienda);

		if (entity == null) {
			throw new ZMessManager().new EmptyFieldException("RebSuerte");
		}

		try {
			rebFechasTratamientos = XMLHibernateDaoFactory.getInstance()
			.getRebFechasTratamientoDAO().findByProperty("rebSuerte.surCodigo", surCodigo);
			
			for (RebFechasTratamiento rebFechasTratamiento : rebFechasTratamientos) {
				if (Utilities.validationsList(rebFechasTratamientos) == true) {
					XMLHibernateDaoFactory.getInstance().getRebFechasTratamientoDAO().delete(rebFechasTratamiento);
				}
			}
			

			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getRebSuerteDAO().delete(
					entity);
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void updateRebSuerte(Double surArea, Integer surCodigo,
			String surEstado, Date surFechadecorte, String surNombre,
			Integer surZafra, Integer hadId_RebHacienda,
			Integer vdcCodigo_RebVariedadDeCana, Integer surTratamiento)
	throws Exception {
		RebSuerte entity = null;

		try {
			if (surArea == null) {
				throw new ZMessManager().new EmptyFieldException("surArea");
			}

			/*
			 * if ((surArea != null) &&
			 * (Utilities.checkNumberAndCheckWithPrecisionAndScale("" + surArea,
			 * 10, 0) == false)) { throw new ZMessManager().new
			 * NotValidFormatException("surArea"); }
			 */

			if (surCodigo == null) {
				throw new ZMessManager().new EmptyFieldException("surCodigo");
			}

			if (surEstado == null) {
				throw new ZMessManager().new EmptyFieldException("surEstado");
			}

			if ((surEstado != null)
					&& (Utilities.checkWordAndCheckWithlength(surEstado, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException(
				"surEstado");
			}

			if (surNombre == null) {
				throw new ZMessManager().new EmptyFieldException("surNombre");
			}

			if ((surNombre != null)
					&& (Utilities.checkWordAndCheckWithlength(surNombre, 60) == false)) {
				throw new ZMessManager().new NotValidFormatException(
				"surNombre");
			}

			if (hadId_RebHacienda == null) {
				throw new ZMessManager().new EmptyFieldException(
				"hadId_RebHacienda");
			}

			if (vdcCodigo_RebVariedadDeCana == null) {
				throw new ZMessManager().new EmptyFieldException(
				"vdcCodigo_RebVariedadDeCana");
			}

			IRebHaciendaLogic logicRebHacienda1 = new RebHaciendaLogic();

			IRebVariedadDeCanaLogic logicRebVariedadDeCana2 = new RebVariedadDeCanaLogic();
			RebHacienda rebHaciendaClass = logicRebHacienda1
			.getRebHacienda(hadId_RebHacienda);
			RebVariedadDeCana rebVariedadDeCanaClass = logicRebVariedadDeCana2
			.getRebVariedadDeCana(vdcCodigo_RebVariedadDeCana);

			if (rebHaciendaClass == null) {
				throw new ZMessManager().new ForeignException("rebHacienda");
			}

			if (rebVariedadDeCanaClass == null) {
				throw new ZMessManager().new ForeignException(
				"rebVariedadDeCana");
			}

			entity = getRebSuerte(surCodigo);

			if (entity == null) {
				throw new ZMessManager(ZMessManager.ENTITY_NOENTITYTOUPDATE);
			}
			Object variables[] = { "rebSuerte.surCodigo", true,
					entity.getSurCodigo(), "=" };
			List<RebFechasTratamiento> entity2;
			entity2 = BusinessDelegatorView.findByCriteriaInRebFechasTratamiento(variables, null,null, "fetFecha");
			System.out.println("fecha del tratamiento" + entity2.size());
			Date date = new Date();
			System.out.println("Esta es la Fecha actula"+date);
			if (!entity2.isEmpty() && date != null) {

				int x = date.compareTo(entity2.get(0).getFetFecha());

				if (x >= 0) {

					double areaTmp = entity.getSurArea();
					entity.setSurArea(surArea);
					entity.setSurCodigo(surCodigo);
					entity.setSurEstado(surEstado);
					entity.setSurFechadecorte(surFechadecorte);
					entity.setSurNombre(surNombre);
					entity.setSurZafra(surZafra);
					entity.setRebHacienda(rebHaciendaClass);
					entity.setRebVariedadDeCana(rebVariedadDeCanaClass);
					HibernateSessionFactory.beginTransaction();
					XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
					.update(entity);
					HibernateSessionFactory.commit();
					rebHaciendaClass.setHadArea(rebHaciendaClass.getHadArea()
							+ (entity.getSurArea() - areaTmp));
					// Actualiza hacienda

					logicRebHacienda1.updateRebHacienda(rebHaciendaClass.getHadAdministrador(), 
							rebHaciendaClass.getHadArea()+ (entity.getSurArea()-surArea), 
							rebHaciendaClass.getHadCodigo(),
							rebHaciendaClass.getHadEmailadmin(),
							rebHaciendaClass.getHadEstado(), 
							rebHaciendaClass.getHadId(), 
							rebHaciendaClass.getHadMayordomo(), 
							rebHaciendaClass.getHadNombre(), 
							rebHaciendaClass.getHadTelefonoadmin(), 
							rebHaciendaClass.getHadTelefonomayo(),
							rebHaciendaClass.getRebCliente().getCliIdentificacion(),
							rebHaciendaClass.getRebIngenio().getIngCodigo(),
							rebHaciendaClass.getRebVereda().getVedCodigo());

					// Fechas tratamientos
					if (surTratamiento != 0) {

						IRebAgentesTratamientoLogic logic = new RebAgentesTratamientoLogic();
						Object variables2[] = { "rebTratamineto.traCodigo",
								true, surTratamiento, "=" };
						RebFechasTratamiento entity3 = new RebFechasTratamiento();
						List<RebAgentesTratamiento> agentesTratamiento = logic.findByCriteria(variables2, null, null);
						Calendar fecha = Calendar.getInstance();
						fecha.setTime(surFechadecorte);
						fecha.add(Calendar.DAY_OF_MONTH, 1);
						System.out.println(fecha.getTime());
						Date fecha2;
						for (RebAgentesTratamiento rebAgentesTratamiento : agentesTratamiento) {

							if (rebAgentesTratamiento.getAgtAplicacion() < 4) {
								fecha.add(Calendar.MONTH, 3);
							} else {
								fecha.add(Calendar.MONTH, 5);
							}

							fecha.add(Calendar.DAY_OF_MONTH, 15);
							fecha2 = fecha.getTime();
							fecha.setTime(surFechadecorte);
							fecha.add(Calendar.DAY_OF_MONTH, 1);
							System.out.println(fecha.getTime());
							entity3.setRebSuerte(entity);
							entity3.setRebAgentesTratamiento(rebAgentesTratamiento);
							entity3.setFetEstado("ACTIVO");
							entity3.setFetCodigo(null);
							entity3.setFetFecha(fecha2);
							IRebFechasTratamientoLogic logic2 = new RebFechasTratamientoLogic();
							logic2.saveRebFechasTratamiento(null, entity3.getFetEstado(), 
									entity3.getFetFecha(),
									entity3.getRebAgentesTratamiento().getAgtCodigo(), 
									entity3.getRebSuerte().getSurCodigo());
							// XMLHibernateDaoFactory.getInstance()
							// .getRebFechasTratamientoDAO().save(entity2);
						}

					}

				} else {
					throw new ZMessManager("No se puede modificar por que tienen vigente un tratamiento");
				}
			}else {
				if (surTratamiento != 0 && surFechadecorte == null){
					throw new ZMessManager("Debe Ingresar una fecha para asignar un tratamiento");
				}
				double areaTmp = entity.getSurArea();
				entity.setSurArea(surArea);
				entity.setSurCodigo(surCodigo);
				entity.setSurEstado(surEstado);
				entity.setSurFechadecorte(surFechadecorte);
				entity.setSurNombre(surNombre);
				entity.setSurZafra(surZafra);
				entity.setRebHacienda(rebHaciendaClass);
				entity.setRebVariedadDeCana(rebVariedadDeCanaClass);
				HibernateSessionFactory.beginTransaction();
				XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
				.update(entity);
				HibernateSessionFactory.commit();
				rebHaciendaClass.setHadArea(rebHaciendaClass.getHadArea()
						+ (entity.getSurArea() - areaTmp));
				// Actualiza hacienda

				logicRebHacienda1.updateRebHacienda(rebHaciendaClass
						.getHadAdministrador(), rebHaciendaClass
						.getHadArea(), rebHaciendaClass.getHadCodigo(),
						rebHaciendaClass.getHadEmailadmin(),
						rebHaciendaClass.getHadEstado(), rebHaciendaClass
						.getHadId(), rebHaciendaClass
						.getHadMayordomo(), rebHaciendaClass
						.getHadNombre(), rebHaciendaClass
						.getHadTelefonoadmin(), rebHaciendaClass
						.getHadTelefonomayo(), rebHaciendaClass
						.getRebCliente().getCliIdentificacion(),
						rebHaciendaClass.getRebIngenio().getIngCodigo(),
						rebHaciendaClass.getRebVereda().getVedCodigo());

				// Fechas tratamientos
				if (surTratamiento != null && surFechadecorte != null) {
					IRebAgentesTratamientoLogic logic = new RebAgentesTratamientoLogic();
					Object variables2[] = { "rebTratamineto.traCodigo", true,
							surTratamiento, "=" };
					RebFechasTratamiento entity3 = new RebFechasTratamiento();
					List<RebAgentesTratamiento> agentesTratamiento = logic
					.findByCriteria(variables2, null, null);
					Calendar fecha1 = Calendar.getInstance();
					fecha1.setTime(surFechadecorte);
					fecha1.add(Calendar.DAY_OF_MONTH, 1);
					System.out.println(fecha1.getTime());
					Date fecha3;
					for (RebAgentesTratamiento rebAgentesTratamiento : agentesTratamiento) {

						if (rebAgentesTratamiento.getAgtAplicacion() < 4) {
							fecha1.add(Calendar.MONTH, 3);
						} else {
							fecha1.add(Calendar.MONTH, 5);
						}

						fecha1.add(Calendar.DAY_OF_MONTH, 15);
						fecha3 = fecha1.getTime();
						fecha1.setTime(surFechadecorte);
						fecha1.add(Calendar.DAY_OF_MONTH, 1);
						System.out.println(fecha1.getTime());
						entity3.setRebSuerte(entity);
						entity3.setRebAgentesTratamiento(rebAgentesTratamiento);
						entity3.setFetEstado("Activo");
						entity3.setFetCodigo(null);
						entity3.setFetFecha(fecha3);
						IRebFechasTratamientoLogic logic3 = new RebFechasTratamientoLogic();
						logic3.saveRebFechasTratamiento(null, entity3
								.getFetEstado(), entity3.getFetFecha(), entity3
								.getRebAgentesTratamiento().getAgtCodigo(), entity3
								.getRebSuerte().getSurCodigo());
						// XMLHibernateDaoFactory.getInstance()
						// .getRebFechasTratamientoDAO().save(entity2);
					}
				}
			}
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}

	}

	public RebSuerte getRebSuerte(Integer surCodigo) throws Exception {
		RebSuerte entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
			.findById(surCodigo);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("RebSuerte");
		} finally {
		}

		return entity;
	}

	public List<RebSuerte> findPageRebSuerte(String sortColumnName,
			boolean sortAscending, int startRow, int maxResults)
			throws Exception {
		List<RebSuerte> entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
			.findPageRebSuerte(sortColumnName, sortAscending, startRow,
					maxResults);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("RebSuerte");
		} finally {
		}

		return entity;
	}

	public Long findTotalNumberRebSuerte() throws Exception {
		Long entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
			.findTotalNumberRebSuerte();
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("RebSuerte Count");
		} finally {
		}

		return entity;
	}

	/**
	 * 
	 * @param varibles
	 *            este arreglo debera tener:
	 * 
	 *            [0] = String variable = (String) varibles[i]; representa como
	 *            se llama la variable en el pojo
	 * 
	 *            [1] = Boolean booVariable = (Boolean) varibles[i + 1];
	 *            representa si el valor necesita o no ''(comillas simples)usado
	 *            para campos de tipo string
	 * 
	 *            [2] = Object value = varibles[i + 2]; representa el valor que
	 *            se va a buscar en la BD
	 * 
	 *            [3] = String comparator = (String) varibles[i + 3]; representa
	 *            que tipo de busqueda voy a hacer.., ejemplo: where
	 *            nombre=william o where nombre<>william, en este campo iria el
	 *            tipo de comparador que quiero si es = o <>
	 * 
	 *            Se itera de 4 en 4..., entonces 4 registros del arreglo
	 *            representan 1 busqueda en un campo, si se ponen mas pues el
	 *            continuara buscando en lo que se le ingresen en los otros 4
	 * 
	 * 
	 * @param variablesBetween
	 * 
	 *            la diferencia son estas dos posiciones
	 * 
	 *            [0] = String variable = (String) varibles[j]; la variable ne
	 *            la BD que va a ser buscada en un rango
	 * 
	 *            [1] = Object value = varibles[j + 1]; valor 1 para buscar en
	 *            un rango
	 * 
	 *            [2] = Object value2 = varibles[j + 2]; valor 2 para buscar en
	 *            un rango ejempolo: a > 1 and a < 5 --> 1 seria value y 5 seria
	 *            value2
	 * 
	 *            [3] = String comparator1 = (String) varibles[j + 3];
	 *            comparador 1 ejemplo: a comparator1 1 and a < 5
	 * 
	 *            [4] = String comparator2 = (String) varibles[j + 4];
	 *            comparador 2 ejemplo: a comparador1>1 and a comparador2<5 (el
	 *            original: a > 1 and a < 5) *
	 * @param variablesBetweenDates
	 *            (en este caso solo para mysql) [0] = String variable =
	 *            (String) varibles[k]; el nombre de la variable que hace
	 *            referencia a una fecha
	 * 
	 *            [1] = Object object1 = varibles[k + 2]; fecha 1 a
	 *            comparar(deben ser dates)
	 * 
	 *            [2] = Object object2 = varibles[k + 3]; fecha 2 a
	 *            comparar(deben ser dates)
	 * 
	 *            esto hace un between entre las dos fechas.
	 * 
	 * @return lista con los objetos que se necesiten
	 * @throws Exception
	 */
	public List<RebSuerte> findByCriteria(Object[] variables,
			Object[] variablesBetween, Object[] variablesBetweenDates)
			throws Exception {
		List<RebSuerte> list = new ArrayList<RebSuerte>();
		String where = new String();
		String tempWhere = new String();
		String ClauseOrder = "";

		if (variables != null) {
			for (int i = 0; i < variables.length; i++) {
				if ((variables[i] != null) && (variables[i + 1] != null)
						&& (variables[i + 2] != null)
						&& (variables[i + 3] != null)) {
					String variable = (String) variables[i];
					Boolean booVariable = (Boolean) variables[i + 1];
					Object value = variables[i + 2];
					String comparator = (String) variables[i + 3];

					if (booVariable.booleanValue()) {
						tempWhere = (tempWhere.length() == 0) ? ("(model."
								+ variable + " " + comparator + " \'" + value + "\' )")
								: (tempWhere + " AND (model." + variable + " "
										+ comparator + " \'" + value + "\' )");
					} else {
						tempWhere = (tempWhere.length() == 0) ? ("(model."
								+ variable + " " + comparator + " " + value + " )")
								: (tempWhere + " AND (model." + variable + " "
										+ comparator + " " + value + " )");
					}
				}

				i = i + 3;
			}
		}

		if (variablesBetween != null) {
			for (int j = 0; j < variablesBetween.length; j++) {
				if ((variablesBetween[j] != null)
						&& (variablesBetween[j + 1] != null)
						&& (variablesBetween[j + 2] != null)
						&& (variablesBetween[j + 3] != null)
						&& (variablesBetween[j + 4] != null)) {
					String variable = (String) variablesBetween[j];
					Object value = variablesBetween[j + 1];
					Object value2 = variablesBetween[j + 2];
					String comparator1 = (String) variablesBetween[j + 3];
					String comparator2 = (String) variablesBetween[j + 4];
					tempWhere = (tempWhere.length() == 0) ? ("(" + value + " "
							+ comparator1 + " " + variable + " and " + variable
							+ " " + comparator2 + " " + value2 + " )")
							: (tempWhere + " AND (" + value + " " + comparator1
									+ " " + variable + " and " + variable + " "
									+ comparator2 + " " + value2 + " )");
				}

				j = j + 4;
			}
		}

		if (variablesBetweenDates != null) {
			for (int k = 0; k < variablesBetweenDates.length; k++) {
				if ((variablesBetweenDates[k] != null)
						&& (variablesBetweenDates[k + 1] != null)
						&& (variablesBetweenDates[k + 2] != null)) {
					String variable = (String) variablesBetweenDates[k];
					Object object1 = variablesBetweenDates[k + 1];
					Object object2 = variablesBetweenDates[k + 2];
					String value = null;
					String value2 = null;

					try {
						Date date1 = (Date) object1;
						Date date2 = (Date) object2;
						value = Utilities
						.formatDateWithoutTimeInAStringForBetweenWhere(date1);
						value2 = Utilities
						.formatDateWithoutTimeInAStringForBetweenWhere(date2);
					} catch (Exception e) {
						list = null;
						throw e;
					}

					tempWhere = (tempWhere.length() == 0) ? ("(model."
							+ variable + " between \'" + value + "\' and \'"
							+ value2 + "\')") : (tempWhere + " AND (model."
									+ variable + " between \'" + value + "\' and \'"
									+ value2 + "\')");
				}

				k = k + 2;
			}
		}
		
		if (tempWhere.length() == 0) {
            where = null;
        } else {
            where = "(" + tempWhere + ")";
        }

		try {
			list = XMLHibernateDaoFactory.getInstance().getRebSuerteDAO()
			.findByCriteria(where);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
		}

		return list;
	}
}
